using System.Collections.Generic;
using Roslyn.Compilers.CSharp;

namespace BITS.PreCompiler.CSharp.Syntax
{
    /// <summary>
    /// Modifier helper.
    /// </summary>
    public static class ModifierHelper
    {
        /// <summary>
        /// Gets the modifers.
        /// </summary>
        /// <param name="modifier">The modifier.</param>
        /// <returns></returns>
        public static List<SyntaxToken> GetModifers(Modifier modifier)
        {
            var list = new List<SyntaxToken>();

            if (modifier.HasFlag(Modifier.Private))
                list.Add(Roslyn.Compilers.CSharp.Syntax.Token(SyntaxKind.PrivateKeyword));

            if (modifier.HasFlag(Modifier.Protected))
                list.Add(Roslyn.Compilers.CSharp.Syntax.Token(SyntaxKind.ProtectedKeyword));

            if (modifier.HasFlag(Modifier.Internal))
                list.Add(Roslyn.Compilers.CSharp.Syntax.Token(SyntaxKind.InternalKeyword));

            if (modifier.HasFlag(Modifier.Public))
                list.Add(Roslyn.Compilers.CSharp.Syntax.Token(SyntaxKind.PublicKeyword));

            if (modifier.HasFlag(Modifier.Partial))
                list.Add(Roslyn.Compilers.CSharp.Syntax.Token(SyntaxKind.PartialKeyword));

            if (modifier.HasFlag(Modifier.Sealed))
                list.Add(Roslyn.Compilers.CSharp.Syntax.Token(SyntaxKind.SealedKeyword));

            if (modifier.HasFlag(Modifier.Virtual))
                list.Add(Roslyn.Compilers.CSharp.Syntax.Token(SyntaxKind.VirtualKeyword));

            if (modifier.HasFlag(Modifier.Abstract))
                list.Add(Roslyn.Compilers.CSharp.Syntax.Token(SyntaxKind.AbstractKeyword));

            if (modifier.HasFlag(Modifier.Static))
                list.Add(Roslyn.Compilers.CSharp.Syntax.Token(SyntaxKind.StaticKeyword));

            if (modifier.HasFlag(Modifier.ReadOnly))
                list.Add(Roslyn.Compilers.CSharp.Syntax.Token(SyntaxKind.ReadOnlyKeyword));

            if (modifier.HasFlag(Modifier.Const))
                list.Add(Roslyn.Compilers.CSharp.Syntax.Token(SyntaxKind.ConstKeyword));

            if (modifier.HasFlag(Modifier.Fixed))
                list.Add(Roslyn.Compilers.CSharp.Syntax.Token(SyntaxKind.FixedKeyword));

            return list;
        }

        /// <summary>
        /// Gets the modifers.
        /// </summary>
        /// <param name="modifiers">The modifiers.</param>
        /// <returns></returns>
        public static List<Modifier> GetModifers(SyntaxTokenList modifiers)
        {
            var list = new List<Modifier>();

            foreach (var modifier in modifiers)
            {
                if (modifier.Kind == SyntaxKind.PrivateKeyword)
                    list.Add(Modifier.Private);

                if (modifier.Kind == SyntaxKind.ProtectedKeyword)
                    list.Add(Modifier.Protected);

                if (modifier.Kind == SyntaxKind.InternalKeyword)
                    list.Add(Modifier.Internal);

                if (modifier.Kind == SyntaxKind.PublicKeyword)
                    list.Add(Modifier.Public);

                if (modifier.Kind == SyntaxKind.PartialKeyword)
                    list.Add(Modifier.Partial);

                if (modifier.Kind == SyntaxKind.SealedKeyword)
                    list.Add(Modifier.Sealed);

                if (modifier.Kind == SyntaxKind.VirtualKeyword)
                    list.Add(Modifier.Virtual);

                if (modifier.Kind == SyntaxKind.AbstractKeyword)
                    list.Add(Modifier.Abstract);

                if (modifier.Kind == SyntaxKind.StaticKeyword)
                    list.Add(Modifier.Static);

                if (modifier.Kind == SyntaxKind.ReadOnlyKeyword)
                    list.Add(Modifier.ReadOnly);

                if (modifier.Kind == SyntaxKind.ConstKeyword)
                    list.Add(Modifier.Const);

                if (modifier.Kind == SyntaxKind.FixedKeyword)
                    list.Add(Modifier.Fixed);
            }

            return list;
        }
    }
}